#include<stdio.h>
#include<unistd.h>
#include<sys/types.h>

int main()
{
    printf("我是一个进程,PID:%d,PPID:%d\n",getpid(),getppid());
    sleep(5);

    //创建一个子进程
    pid_t id=fork();
    
    //fork会返回两个pid_t类型的值
    //给子进程返回0，给父进程返回子进程的pid

    //一个函数怎么做到返回两次的？
    //fork()是一个函数 当他return的时候 那么这个函数的内部核心操作一定完成了
    //fork是创建一个子进程 那么就需要：
    //1.创建子进程PCB
    //2.填充PCB对应的内容
    //3.让子进程和父进程指向同样的代码
    //4.父子进程都是独立的task_struct,可以被cpu独立调度运行了！
    //一般fork之后代码 父子共享
    //那么此时return的时候 父子进程就会各自return返回值
    
    //fork之后父子共享同一份代码 代码是不可以修改的
    //但是数据是可以修改的
    //因此需要给子进程拷贝一份数据
    //为了减少不必要的消耗 采用 写时拷贝
    if(id==0)
    {
        while(1)
        {
             printf("我是子进程,PID:%d,PPID:%d\n",getpid(),getppid());
             sleep(1);
        }    
    }
    else if(id>0)
    {
        while(1)
        {
             printf("我是父进程,PID:%d,PPID:%d\n",getpid(),getppid());
             sleep(1);
        }
    }
    else
    {
        //erreo;
    }

    printf("\n");
    
    return 0;
}
